perm filename EMITE2.SAI[OLD,HE] blob
sn#290129 filedate 1977-06-28 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00004 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 ENTRY COMMENT INT_TO_FLOAT, COMERR
C00005 00003 ! INITOUT, CLOSEOUT
C00007 00004 ! MAKE_REMARK, EMIT
C00013 ENDMK
C⊗;
ENTRY; COMMENT INT_TO_FLOAT, COMERR;
BEGIN "emiter"
REQUIRE "ABBREV.SAI[AL,HE]" SOURCE_FILE;
REQUIRE "EMITER.HDR[AL,HE]" SOURCE_FILE;
! That will define all the RELOC and PC constants;
INTERNAL PROCEDURE INT_TO_11FLOAT(REFERENCE INTEGER RES1, RES2; REAL ARG);
BEGIN "inttf"
! ARG is transformed into two integers, NUM1 and NUM2, which
represent that real in pdp11 floating format;
INTEGER BYTE;
REAL T;
LABEL ST1, ST2;
INTEGER NUM1, NUM2;
BYTE←'013200000002;
T ← ARG;
START_CODE
MOVE 2,T;
JUMPGE 2,ST1;
MOVN 2,2;
TLO 2,'400000;
ST1: JFCL 2,ST2;
ST2: ADDI 2,4;
DPB 2,BYTE;
SETZ 1,;
LSHC 1,16;
MOVEM 1,NUM1;
SETZ 1,;
LSHC 1,16;
MOVEM 1,NUM2;
END;
RES1 ← NUM1;
RES2 ← NUM2;
END "inttf";
INTERNAL PROCEDURE COMERR
(STRING MESSG;RECORD_POINTER(ANY_CLASS) CONTXT (NULL_RECORD));
! Non-fatal warnings;
USERERR(0,1,"HAH! "&MESSG);
! INITOUT, CLOSEOUT;
INTEGER REL0; ! Channel number;
INTEGER REL1; ! Channel number;
INTEGER REL2; ! Channel number;
INTEGER REL3; ! Channel number;
INTERNAL PROCEDURE INITOUT(STRING FNAME,PPN);
BEGIN "initout" ! Initialize the one output stream, going to the file
TTEST.DAT;
INTEGER COUNT, BRCHAR, EOF, FLAG;
REL1 ← GETCHAN;
OPEN(REL1,"DSK",0,0,2,COUNT,BRCHAR,EOF);
ENTER(REL1,"TTEST.DAT",FLAG);
IF FLAG THEN COMERR("I can't enter TTEST.DAT");
END "initout";
INTERNAL PROCEDURE CLOSEOUT;
BEGIN ! Close all channels;
CLOSE(REL1);
END;
! MAKE_REMARK, EMIT;
STRING RSTRING;
INTERNAL PROCEDURE EMIT(INTEGER PC; REFERENCE INTEGER DATA, RELOC;
INTEGER LTH (1));
BEGIN "emit"
! Appends to current PAL files. DATA and RELOC are the first
words in a block of size LTH. DATA holds the actual output, and
RELOC holds relocation information about how to treat the word in
DATA. A record is kept of how many bytes have been stored for
each PC;
OWN INTEGER ARRAY WORDCOUNT [0:3]; ! How many words have been stored
for this PC;
INTEGER J, K, DAT;
EXTERNAL STRING ARRAY PSOP[1:300];
FOR J ← 0 STEP 1 UNTIL LTH-1 DO
BEGIN "emitloop"
DAT ← MEMORY[LOC(DATA) + J];
CASE MEMORY[LOC(RELOC) + J] OF
BEGIN "case"
[PSINST]
; ! Removed in this version;
[SYMDEC]
; ! Removed in this version;
[SYMREF]
IF PC = TJFILE
THEN OUT(REL1,"0" & CRLF);
[REMARK]
; ! Removed in this version;
[SKIP]
; ! Removed in this version;
[CONST]
IF PC = TJFILE
THEN OUT(REL1,CVOS(DAT) & CRLF)
END "case";
END "emitloop";
END "emit";
INTERNAL PROCEDURE MAKE_REMARK(INTEGER PC;STRING REMK);
BEGIN "make_remark" ! Outputs this remark to the PAL file;
RSTRING ← REMK;
EMIT(PC,0,REMARK);
END "make_remark";
END "emiter";